package com.chub.resp;

import cn.hutool.core.util.StrUtil;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

/**
 * @author chub
 */
@Builder
@Data
public class ResponseResult<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 响应状态
     */
    private Boolean state;

    /**
     * 状态码
     */
    private String code;

    /**
     * 状态信息
     */
    private String msg;

    /**
     * 数据信息
     */
    private T data;

    // public static ResponseResult<String> success() {
    //     return success(null);
    // }

    /**
     * 私有构造
     *
     * @param state   响应状态
     * @param code    状态码
     * @param message 状态信息
     * @param data    数据
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    private static <T> ResponseResult<T> response(Boolean state, String code, String message, T data) {
        return ResponseResult.<T>builder()
                .state(state)
                .code(code)
                .msg(message)
                .data(data)
                .build();
    }

    /**
     * @description : 请求成功返回（一）
     *
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> success() {
        return response(true, ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), null);
    }

    /**
     * @description : 请求成功返回（二）
     *
     * @param  : msg
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> success(String msg) {
        return response(true, ResponseEnum.SUCCESS.getCode(), msg, null);
    }

    /**
     * @description : 请求成功返回（三）
     *
     * @param  : data
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> success(T data) {
        return response(true, ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), data);
    }

    /**
     * @description : 请求成功返回（四）
     *
     * @param  : msg
     * @param  : data
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> success(String msg, T data) {
        return response(true, ResponseEnum.SUCCESS.getCode(), msg, data);
    }

    /**
     * 请求成功返回（五）  格式化返回参数
     * example：ResponseResult.success("first param-->{}, 2nd param-->{}, 3th param-->{}", id, oldName, newName)
     * @param msg
     * @param args
     * @param <T>
     * @return
     */
    public static <T> ResponseResult<T> success(String msg, Object... args) {
//        msg = String.format(msg, args);
//        msg = MessageFormat.format(msg, args);
        msg = StrUtil.format(msg, args);
        return response(true, ResponseEnum.SUCCESS.getCode(), msg, null);
    }



    /**
     * @description : 请求失败返回（一）
     *
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> failed() {
        return response(false, ResponseEnum.FAIL.getCode(), ResponseEnum.FAIL.getMsg(), null);
    }

    /**
     * @description : 请求失败返回（二）
     *
     * @param  : code
     * @param  : msg
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> failed(String code, String msg) {
        return response(false, code, msg, null);
    }

    /**
     * @description : 请求失败返回（三）
     *
     * @param  : data
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> failed(T data) {
        return response(false, ResponseEnum.FAIL.getCode(), ResponseEnum.FAIL.getMsg(), data);
    }

    /**
     * @description : 请求失败返回（四）
     *
     * @param  : msg
     * @param  : data
     * @return : ResponseResult<T>
     */
    public static <T> ResponseResult<T> failed(String msg, T data) {
        return response(false, ResponseEnum.FAIL.getCode(), msg, data);
    }





    // public static <T> ResponseResult<T> success(T data) {
    //     return ResponseResult.<T>builder()
    //             .code(ResponseEnum.SUCCESS.getCode())
    //             .msg(ResponseEnum.SUCCESS.getMsg())
    //             .data(data)
    //             .build();
    // }
    //
    // public static <T> ResponseResult<T> success(String msg) {
    //     return ResponseResult.<T>builder()
    //             .code(ResponseEnum.SUCCESS.getCode())
    //             .msg(msg)
    //             .build();
    // }
    //
    // public static ResponseResult<String> failed(String msg) {
    //     return fail(ResponseEnum.FAIL, msg);
    // }
    //
    // public static <T> ResponseResult<T> failed(ResponseEnum respCode, String msg) {
    //     return ResponseResult.<T>builder()
    //             .code(respCode.getCode())
    //             .msg(msg)
    //             .build();
    // }

    /**
     * 格式化返回参数
     * example：ResponseResult.success("first param-->{}, 2nd param-->{}, 3th param-->{}", id, oldName, newName)
     * @param msg
     * @param args
     * @param <T>
     * @return
     */
//     public static <T> ResponseResult<T> success(String msg, Object... args) {
// //        msg = String.format(msg, args);
// //        msg = MessageFormat.format(msg, args);
//         msg = StrUtil.format(msg, args);
//         return ResponseResult.<T>builder()
//                 .code(ResponseEnum.SUCCESS.getCode())
//                 .msg(msg)
//                 .build();
//     }

}
